const express = require("express");
require("dotenv").config();
const bodyParser = require("body-parser");
const app = express();
const cron = require("node-cron");
const {
  cleanupFiles,
  cleanAvatar,
  cleanFeedback,
  cleanComment,
} = require("./utils/cleanFile.js");
// 路由模块
const adminUserRouter = require("./router/admin/user.js");
const adminFoodRouter = require("./router/admin/food.js");
const adminTravelRouter = require("./router/admin/travel.js");
const adminRoleRouter = require("./router/admin/role.js");
const adminMenusRouter = require("./router/admin/menus.js");
const adminMediaRouter = require("./router/admin/media.js");
const adminCommentRouter = require("./router/admin/comment.js");
const adminFeedbackRouter = require("./router/admin/feedback.js");

// 客户端请求接口
const clientDataRouter = require("./router/api/data.js");

// 导入jwt
// const jwt = require("jsonwebtoken");
const { expressjwt } = require("express-jwt");
// 使用body-parser中间件解析JSON格式的请求体
app.use(bodyParser.json());
// 解析post表单数据中间件
app.use(express.urlencoded({ extended: false }));

// 静态资源
app.use("/public", express.static("public"));
// 引入cors跨域
const cors = require("cors");
app.use(cors());

// 注册将 JWT 字符串解析还原成 JSON 对象的中间件
// 注意：只要配置成功了 express-jwt 这个中间件，就可以把解析出来的用户信息，挂载到 req.user 属性上
app.use(
  expressjwt({ secret: process.env.SECRETKEY, algorithms: ["HS256"] }).unless({
    path: [
      "/admin/user/login",
      /^\/uploads\//,
      /^\/api\//,
      /^\/test\//,
      "/admin/user/test",
      "/admin/food/upload",
      "/admin/travel/upload",
    ],
  })
);
// 使用全局错误处理中间件，捕获解析 JWT 失败后产生的错误
app.use((err, req, res, next) => {
  // console.log(err);
  // 这次错误是由 token 解析失败导致的
  if (err.name === "UnauthorizedError") {
    return res.send({
      status: 401,
      message: "无效的token",
    });
  }
  res.send({
    status: 500,
    message: "未知的错误",
  });
});
// 后台管理系统用户管理api
app.use("/admin/user", adminUserRouter);
// 后台系统美食模块
app.use("/admin/food", adminFoodRouter);
// 后台系统旅游模块
app.use("/admin/travel", adminTravelRouter);
// 后台系统职位角色管理模块
app.use("/admin/acl", adminRoleRouter);
// 后台系统菜单管理模块
app.use("/admin/menus", adminMenusRouter);
// 后台系统媒体管理模块
app.use("/admin/media", adminMediaRouter);
// 后台系统评论管理模块
app.use("/admin/comment", adminCommentRouter);
// 后台系统反馈管理模块
app.use("/admin/feedback", adminFeedbackRouter);

// 客户端请求接口
app.use("/api", clientDataRouter);

// 在服务器启动时执行一次定时任务
cleanupFiles()
  .then(() => {
    // 每天的凌晨 1 点执行清理文件的任务
    cron.schedule("0 1 * * *", cleanupFiles);
  })
  .catch((error) => {
    console.error(error);
  });

cleanAvatar()
  .then(() => {
    // 每天的凌晨 1 点执行清理文件的任务
    cron.schedule("0 1 * * *", cleanAvatar);
  })
  .catch((error) => {
    console.error(error);
  });
cleanFeedback()
  .then(() => {
    // 每天的凌晨 1 点执行清理文件的任务
    cron.schedule("0 1 * * *", cleanFeedback);
  })
  .catch((error) => {
    console.error(error);
  });
cleanComment()
  .then(() => {
    // 每天的凌晨 1 点执行清理文件的任务
    cron.schedule("0 1 * * *", cleanComment);
  })
  .catch((error) => {
    console.error(error);
  });
app.listen(process.env.SERVER_PORT, () => {
  console.log(`服务器启动成功，${process.env.SERVER_PORT}监听中！`);
});
